package cn.flkj.evidence.util;

import org.apache.commons.lang.StringUtils;

import java.io.*;
import java.security.MessageDigest;

/**
 * @author : 州长在手 2020/9/7 下午3:55
 */
public class FileUtil {
    /**
     * Rename the file.
     */
    public static boolean rename(final File file, final String newName) {
        // file is null then return false
        if (file == null) return false;
        // file doesn't exist then return false
        if (!file.exists()) return false;
        // the new name is space then return false
        if (newName.isEmpty()) return false;
        // the new name equals old name then return true
        if (newName.equals(file.getName())) return true;
        File newFile = new File(file.getParent() + File.separator + newName);
        // the new name of file exists then return false
        return !newFile.exists()
                && file.renameTo(newFile);
    }


    public static boolean createMultilevelDirectory(String[] directories,String rootPath) throws IOException {
        if (directories.length == 0) {
            return false;
        }
        File root = new File(rootPath);
        for (String s : directories) {
            File directory = new File(root, s);
            if (directory.mkdir()) return false;
            root = directory;
        }
        return true;
    }

    public static boolean createDir(String destDirName) {
        File dir = new File(destDirName);
        if (dir.exists()) {
            return false;
        }
        if (!destDirName.endsWith(File.separator)) {
            destDirName = destDirName + File.separator;
        }
        //创建目录
        if (dir.mkdirs()) {
            return true;
        } else {
            return false;
        }
    }
    /**
     * 保证文件的MD5值为32位
     *
     * @param filePath 文件路径
     * @return md5 code
     * @throws FileNotFoundException not fund ?
     */
    public static String md5HashCode32(String filePath) throws FileNotFoundException {
        FileInputStream fis = new FileInputStream(filePath);
        return getMd5HashCode32(fis);
    }

    /**
     * java计算文件32位md5值
     *
     * @param fis 输入流
     * @return md5 32
     */
    private static String getMd5HashCode32(InputStream fis) {
        return getMd5HashCode32ByInputStream(fis);
    }

    private static String getMd5HashCode32ByInputStream(InputStream fis) {
        try{
            //拿到一个MD5转换器,如果想使用SHA-1或SHA-256，则传入SHA-1,SHA-256
            MessageDigest md = MessageDigest.getInstance("MD5");

            //分多次将一个文件读入，对于大型文件而言，比较推荐这种方式，占用内存比较少。
            byte[] buffer = new byte[1024];
            int length;
            while ((length = fis.read(buffer, 0, 1024)) != -1) {
                md.update(buffer, 0, length);
            }
            fis.close();

            //转换并返回包含16个元素字节数组,返回数值范围为-128到127
            byte[] md5Bytes = md.digest();
            StringBuilder hexValue = new StringBuilder();
            /*
             * 如果小于16，那么val值的16进制形式必然为一位，
             * 因为十进制0,1...9,10,11,12,13,14,15 对应的 16进制为 0,1...9,a,b,c,d,e,f;
             * 此处高位补0。
             */
            for (byte md5Byte : md5Bytes) {
                int val = ((int) md5Byte) & 0xff;//解释参见最下方
                if (val < 16) {
                    hexValue.append("0");
                }
                //这里借助了Integer类的方法实现16进制的转换
                hexValue.append(Integer.toHexString(val));
            }
            return hexValue.toString();
        } catch (Exception e) {
            e.printStackTrace();
            return "";
        }
    }
}
